package com.atguigu.config;

import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.condition.LinusCondition;
import com.atguigu.condition.MyImportBeanDefinitionRegistrar;
import com.atguigu.condition.MyImportSelector;
import com.atguigu.condition.WindowsCondition;
import com.atguigu.service.BookService;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;

//类中组件统一设置 :满足当前条件,这个类中配置的所有bean才能生效
@Conditional({WindowsCondition.class})
@Configuration  //告诉spring这是一个配置类
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) //@Import快速导入组件  id默认是组件的全类名
public class MainConfig2 {

    //默认是单实例的
    /**
     * prototype:多实例的  ioc容器启动并不会去调用方法创建对象放在容器中
     *           每次获取的时候才会调用方法创建对象
     * singleton:单实例的(默认值) ioc容器会调用方法创建对象放到ioc容器中,
     *          以后每次获取就是直接从容器(map.get())中拿,
     * 其他两种用不到
     * request:同一次请求创建一个实例
     * session:同一个session创建一个实例
     *
     * 懒加载: 针对单实例bean
     *          单实例bean:默认在容器启动的时候创建对象
     *          懒加载,容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化
     *
     */
    //@Scope("prototype")
    @Lazy
    @Bean("person") //给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名
    public Person person(){
        System.out.println("容器中添加Person");
        return new Person("张三",25);
    }

    /**
     * @Conditional({Condition}) 按照一定的条件进行判断,满足条件给容器中注册bean
     * 如果系统是windows,给容器中注册("bill")
     * 如果系统是linux系统,给容器中注册("linux")
     */
    @Conditional({WindowsCondition.class})
    @Bean("bill")
    public Person person01(){
        return new Person("Bili Gates",62);
    }

    @Conditional({LinusCondition.class})
    @Bean("linus")
    public Person person02(){
        return new Person("linus",48);
    }

    /*
    * 给容器中注册组件
    * 1)、 包扫描 + 组件标注注解(@Controller/@Service/@Repository/@Component) (自己写的)
    * 2)、@Bean[导入的第三方包里面的组件]
    * 3)、@Import[快速给容器中导入一个组件]
    *       1).@Import(要导到容器中的组件),容器中就会自动注册这个组件,id默认是全类名
    *       2).ImportSelector:返回需要导入的组件的全类名数组;
    *       3).ImportBeanDefinitionRegistrar 手动注册bean到容器中
    * 4)、使用Spring提供的FactoryBean(工厂Bean)
    *       1. 默认获取到的是工厂bean调用getObject创建的对象
    *       2. 获取工厂Bean本身,我们需要给id前面加个&
    *           &colorFactoryBean
    *
    * */
    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }

}
